package com.navinfo.platform.flink.cdc.util;

import org.apache.flink.api.java.utils.ParameterTool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URISyntaxException;

/**
 * @desc: 加载配置文件的工具类
 * @author: web
 * @date: 2020-09-03
 **/
public class ConfigUtils {
    private static final Logger logger = LoggerFactory.getLogger(ConfigUtils.class);

    /**
     * 配置文件的文件夹名
     */
    private static final String CONFIG_PATH = "config";

    /**
     * 加载ClassPath根目录的配置文件<br/>
     * 并使用命令行中传入的参数覆盖配置文件中的值<br/>
     * 命令行通过--key或-key value传值
     * @param args 命令行参数
     * @param filePath  文件目录
     * @return filePath文件的配置
     */
    public static ParameterTool loadClassPathConfig(String[] args, String filePath) throws URISyntaxException, IOException {
        ParameterTool fileParameter = ParameterTool.fromPropertiesFile(Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath));
        ParameterTool argsParameter = ParameterTool.fromArgs(args);

        //命令行中的配置覆盖file中的配置
        ParameterTool parameterTool = fileParameter.mergeWith(argsParameter);

        logger.info("加载[{}]的配置开始......",filePath);
        parameterTool.toMap().forEach((s, s2) -> logger.info(">>>{}--{}", s, s2));
        logger.info("加载[{}]的配置结束......",filePath);
        return parameterTool;
    }

    /**
     * 加载当前Jar包同目录的配置文件<br/>
     * 并使用命令行中传入的参数覆盖配置文件中的值<br/>
     * 命令行通过--key或-key value传值
     * @param args 命令行参数
     * @param filePath  文件目录
     * @return filePath文件的配置
     */
    public static ParameterTool loadJarPathConfig(String[] args, String filePath) throws IOException, URISyntaxException {
        filePath = CONFIG_PATH + File.separator + filePath;
        File directory = new File(ConfigUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParentFile();
        ParameterTool fileParameter = ParameterTool.fromPropertiesFile(new FileInputStream(directory.getAbsolutePath() + File.separator + filePath));
        ParameterTool argsParameter = ParameterTool.fromArgs(args);

        //命令行中的配置覆盖file中的配置
        ParameterTool parameterTool = fileParameter.mergeWith(argsParameter);

        logger.info(">>>>>>加载[{}]的配置开始:>>>>>>", filePath);
        parameterTool.toMap().forEach((s, s2) -> logger.info(">>>{}----{}", s, s2));
        logger.info(">>>>>>加载[{}]的配置结束：>>>>>>", filePath);
        return parameterTool;
    }

}
